
// 包含 dev_t
#include <linux/types.h>

// 包含这三个 宏MAJOR MINOR MKDEV
#include <linux/kdev_t.h>

// 注册字符设备需要包含的头文件
//#include <linux/fs.h>

// 注册块设备需要包含的头文件
#include <linux/blkdev.h>
#include <linux/module.h>

#define HELLO_MAJAR 0
#define HELLO_NR_DEVS 2

// 定义主设备号
int hello_major = HELLO_MAJAR;
// 定义次设备号
//int hello_minor = 0;

// 结合主设备号和次设备号
// 高12位是主设备号，低20位是次设备号
//dev_t hello_dev;

// 次设备号的个数
//int hello_nr_devs = HELLO_NR_DEVS;

module_param(hello_major, int, S_IRUGO);

//module_param(hello_minor, int, S_IRUGO);

//module_param(hello_nr_devs, int, S_IRUGO);

int __init blk_init(void);

void __exit blk_exit(void);

int __init blk_init(void)
{
    int ret;

    printk(KERN_INFO "begin to register block device module\n");

    ret = register_blkdev(hello_major, "hello_block_device");

    if (ret < 0)
    {
        printk(KERN_WARNING "hello_blk_device: can't get marjor %d\n", hello_major);
        return ret;
    }

    if (!hello_major)
    {

        hello_major = ret;
    }

    printk(KERN_INFO "successfully allocate hello block device, major: %d  ret: %d", hello_major,ret);

    return 0;
}

void __exit blk_exit(void)
{

    unregister_blkdev(hello_major, "hello_block_device");
    printk(KERN_INFO "unregister block device successfully!\n");
}

module_init(blk_init);

module_exit(blk_exit);

//  许可证描述
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("luojunhua");
MODULE_VERSION("V1.0");